#include "plot.h"
#include "datescaledraw.h"
#include <qwt_plot_grid.h>
#include "QPen"
#include "zoomer.h"
#include <qwt_plot_price.h>
#include <qwt_price_move.h>
#include <qwt_series_data.h>
#include <iostream>
#include <math.h>
#include <string>
#include <fstream>
#include <QtGui>
using namespace std;


/*
 Classe Plot, recebe como parametro um vetor de pontos x e y.
 Utilize o metodo resize(int,int) para determinar as dimensoes do grafico
*/

Plot::Plot(QWidget *parent)
    : QwtPlot(parent){
}

void Plot::setData(const QwtArray<QwtDoublePoint> *dados, const QwtArray<QwtDoublePoint> *dados_2, const QwtArray<QwtDoublePoint> *dados_3)
{
    price = NULL;
    pontos_4 = NULL;
    //Background
    setCanvasBackground(QColor(Qt::black)); //branco

    //Grid
    QwtPlotGrid *grid = new QwtPlotGrid;
    //linhas cinza claro no estilo DotLine (traco ponto ponto traco)
    grid->setMajPen(QPen(Qt::darkGray, 0, Qt::DotLine));
    grid->setMinPen(QPen(Qt::darkGray, 0 , Qt::DotLine));
    grid->attach(this);

    // Eixos
    this->setAxisAutoScale(yLeft);
    this->setAxisAutoScale(xBottom);


    //Plotando grafico 1
    pontos = new QwtPlotCurve();
    //Plotando o array de pontos
    pontos->setData(*dados);
    //Linha: azul, largura 2, solida, cantos arredondados
    QPen pen(Qt::cyan, 2, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
    //frescura.... muito massa!!! -> Antialiased
    pontos->setRenderHint(QwtPlotItem::RenderAntialiased);
    pontos->setPen(pen);
    pontos->attach(this);


    //Plotando grafico 2
    pontos_2 = new QwtPlotCurve();
    pontos_2->setData(*dados_2);
    QPen pen1(Qt::yellow, 2, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
    pontos_2->setRenderHint(QwtPlotItem::RenderAntialiased);
    pontos_2->setPen(pen1);
    pontos_2->attach(this);


    //Plotando grafico 3
    pontos_3 = new QwtPlotCurve();
    pontos_3->setData(*dados_3);
    QPen pen2(Qt::gray, 2, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
    pontos_3->setRenderHint(QwtPlotItem::RenderAntialiased);
    pontos_3->setPen(pen2);
    pontos_3->attach(this);


    setAxisScaleDraw(QwtPlot::xBottom, new DateScaleDraw());
    QFont serifFont("Times", 8, QFont::Bold);
    QFont serifFont1("Times", 0, QFont::Bold);
    this->setAxisFont(xBottom,serifFont1);
    this->setAxisFont(yLeft,serifFont);

}

void Plot::setData(const QwtArray<QwtDoublePoint> *dados, const QwtArray<QwtDoublePoint> *dados_2, const QwtArray<QwtDoublePoint> *dados_3, const QwtArray<QwtDoublePoint> *dados_4)
{
    price = NULL;
    //Background
    setCanvasBackground(QColor(Qt::black)); //branco

    //Grid
    QwtPlotGrid *grid = new QwtPlotGrid;
    //linhas cinza claro no estilo DotLine (traco ponto ponto traco)
    grid->setMajPen(QPen(Qt::darkGray, 0, Qt::DotLine));
    grid->setMinPen(QPen(Qt::darkGray, 0 , Qt::DotLine));
    grid->attach(this);

    // Eixos
    this->setAxisAutoScale(yLeft);
    this->setAxisAutoScale(xBottom);


    //Plotando grafico 1
    pontos = new QwtPlotCurve();
    //Plotando o array de pontos
    pontos->setData(*dados);
    //Linha: azul, largura 2, solida, cantos arredondados
    QPen pen(Qt::cyan, 2, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
    //frescura.... muito massa!!! -> Antialiased
    pontos->setRenderHint(QwtPlotItem::RenderAntialiased);
    pontos->setPen(pen);
    pontos->attach(this);


    //Plotando grafico 2
    pontos_2 = new QwtPlotCurve();
    pontos_2->setData(*dados_2);
    QPen pen1(Qt::yellow, 2, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
    pontos_2->setRenderHint(QwtPlotItem::RenderAntialiased);
    pontos_2->setPen(pen1);
    pontos_2->attach(this);


    //Plotando grafico 3
    pontos_3 = new QwtPlotCurve();
    pontos_3->setData(*dados_3);
    QPen pen2(Qt::gray, 2, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
    pontos_3->setRenderHint(QwtPlotItem::RenderAntialiased);
    pontos_3->setPen(pen2);
    pontos_3->attach(this);

    //Plotando grafico 4
    pontos_4 = new QwtPlotCurve();
    pontos_4->setData(*dados_4);
    QPen pen3(Qt::gray, 2, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
    pontos_4->setRenderHint(QwtPlotItem::RenderAntialiased);
    pontos_4->setPen(pen3);
    pontos_4->attach(this);

    setAxisScaleDraw(QwtPlot::xBottom, new DateScaleDraw());
    QFont serifFont("Times", 8, QFont::Bold);
    QFont serifFont1("Times", 0, QFont::Bold);
    this->setAxisFont(xBottom,serifFont1);
    this->setAxisFont(yLeft,serifFont);

}

void Plot::setData(const QwtArray<QwtDoublePoint> *dados, const QwtArray<QwtDoublePoint> *dados_2)
{
    pontos_3 = NULL;
    pontos_4 = NULL;
    price = NULL;
    //Background
    setCanvasBackground(QColor(Qt::black)); //branco

    //Grid
    QwtPlotGrid *grid = new QwtPlotGrid;
    //linhas cinza claro no estilo DotLine (traco ponto ponto traco)
    grid->setMajPen(QPen(Qt::darkGray, 0, Qt::DotLine));
    grid->setMinPen(QPen(Qt::darkGray, 0 , Qt::DotLine));
    grid->attach(this);

    // Eixos
    this->setAxisAutoScale(yLeft);
    this->setAxisAutoScale(xBottom);


    //Plotando grafico 1
    pontos = new QwtPlotCurve();
    //Plotando o array de pontos
    pontos->setData(*dados);
    //Linha: azul, largura 2, solida, cantos arredondados
    QPen pen(Qt::yellow, 2, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
    //frescura.... muito massa!!! -> Antialiased
    pontos->setRenderHint(QwtPlotItem::RenderAntialiased);
    pontos->setPen(pen);
    pontos->attach(this);


    //Plotando grafico 2
    pontos_2 = new QwtPlotCurve();
    pontos_2->setData(*dados_2);
    QPen pen1(Qt::gray, 2, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
    pontos_2->setRenderHint(QwtPlotItem::RenderAntialiased);
    pontos_2->setPen(pen1);
    pontos_2->attach(this);


    setAxisScaleDraw(QwtPlot::xBottom, new DateScaleDraw());
    QFont serifFont("Times", 8, QFont::Bold);
    QFont serifFont1("Times", 0, QFont::Bold);
    this->setAxisFont(xBottom,serifFont1);
    this->setAxisFont(yLeft,serifFont);

}


void Plot::setData(const QwtArray<QwtDoublePoint> *dados)
{
    price = NULL;
    pontos_2 = NULL;
    pontos_3 = NULL;
    pontos_4 = NULL;
    //Background
    setCanvasBackground(QColor(Qt::black)); //branco

    //Grid
    QwtPlotGrid *grid = new QwtPlotGrid;
    //linhas cinza claro no estilo DotLine (traco ponto ponto traco)
    grid->setMajPen(QPen(Qt::darkGray, 0, Qt::DotLine));
    grid->setMinPen(QPen(Qt::darkGray, 0 , Qt::DotLine));
    grid->attach(this);

    // Eixos
    this->setAxisAutoScale(yLeft);
    this->setAxisAutoScale(xBottom);

    //Plotando pontos...
    pontos = new QwtPlotCurve();
    //Plotando o array de pontos
    pontos->setData(*dados);
    //frescura.... muito massa!!! -> Antialiased
    pontos->setRenderHint(QwtPlotItem::RenderAntialiased);

    //Linha: azul, largura 2, solida, cantos arredondados
    QPen pen(Qt::blue, 2, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
    pontos->setPen(pen);
    pontos->attach(this);

    setAxisScaleDraw(QwtPlot::xBottom, new DateScaleDraw());
    QFont serifFont("Times", 8, QFont::Bold);
    QFont serifFont1("Times", 0, QFont::Bold);
    this->setAxisFont(xBottom,serifFont1);
    this->setAxisFont(yLeft,serifFont);

}


void Plot::limpa(){
    if(price != NULL){
        delete price;
        price = NULL;
    }
    if(pontos != NULL){
        delete pontos;
        pontos = NULL;
    }
    if(pontos_2 != NULL){
        delete pontos_2;
        pontos_2 = NULL;
    }
    if(pontos_3 != NULL){
        delete pontos_3;
        pontos_3 = NULL;
    }
    if(pontos_4 != NULL){
        delete pontos_4;
        pontos_4 = NULL;
    }
    this->detachItems(0,true);
}

void Plot::setData(QwtArray<QwtPriceMove> *candles, QwtArray<QwtDoublePoint> *bb_bs, QwtArray<QwtDoublePoint> *bb_bi, QwtArray<QwtDoublePoint> *MaxMin)
{

    pontos = NULL;
    pontos_2 = NULL;
    pontos_3 = NULL;
    pontos_4 = NULL;
    //Background
    //setCanvasBackground(QColor(Qt::black)); //branco
    setCanvasBackground(QColor(Qt::black)); //branco

    //Grid
    QwtPlotGrid *grid = new QwtPlotGrid;
    //grid->enableXMin(true); //permite imprimir o grid entre os valores inteiro
    //grid->enableYMin(true); //idem
    //linhas cinza claro no estilo DotLine (traco ponto ponto traco)
    grid->setMajPen(QPen(Qt::darkGray, 0, Qt::DotLine));
    grid->setMinPen(QPen(Qt::black, 2 , Qt::DotLine));
    grid->attach(this);

    this->setAxisAutoScale(yLeft);
    this->setAxisAutoScale(xBottom);

    price = new QwtPlotPrice();
    // Set the style of the plot :
    //  * QwtPlotPrice::Candlestick for Japaneses candlestick
    //  * QwtPlotPrice::OHLC for open-high-low-close barchart
    price->setStyle(QwtPlotPrice::Candlestick);
    // Outline color of the price items
    price->setPen(QPen(Qt::gray));

    // Set the colors of the moves
    // By default : transparent when the price goes up, black when it goes down
    price->setUpBrush(Qt::green);
    price->setDownBrush(Qt::red);

    price->setData(QwtPriceMoveSeriesData(*candles));
    price->attach(this);

    //Plotando banda de boillinger superior
    pontos = new QwtPlotCurve();
    pontos->setData(*bb_bs);
    QPen pen(Qt::gray, 0, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
    pontos->setRenderHint(QwtPlotItem::RenderAntialiased);
    pontos->setPen(pen);
    pontos->attach(this);

    //Plotando grafico 3
    pontos_2 = new QwtPlotCurve();
    pontos_2->setData(*bb_bi);
    QPen pen2(Qt::gray, 0, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
    pontos_2->setRenderHint(QwtPlotItem::RenderAntialiased);
    pontos_2->setPen(pen2);
    pontos_2->attach(this);

    setAxisScaleDraw(QwtPlot::xBottom, new DateScaleDraw());
    QFont serifFont("Times", 8, QFont::Bold);
    QFont serifFont1("Times", 0, QFont::Bold);
    this->setAxisFont(xBottom,serifFont1);
    this->setAxisFont(yLeft,serifFont);

}

void Plot::zoom(){
    //-----------------------------------------------------------------
    //Zoom
    //-----------------------------------------------------------------

    QwtPlotZoomer *d_zoomer[2];
    d_zoomer[0] = new Zoomer( QwtPlot::xBottom, QwtPlot::yLeft,
                              this->canvas());
    //Desenhando linhas que indicam a area onde vai ser dado o zoom
    d_zoomer[0]->setRubberBand(QwtPicker::RectRubberBand);
    d_zoomer[0]->setRubberBandPen(QColor(Qt::white));
    d_zoomer[1] = new Zoomer(QwtPlot::xTop, QwtPlot::yRight,
         this->canvas());
    //Desenha duas retas perpendiculares
    QwtPlotPicker *d_picker;
    d_picker = new QwtPlotPicker(QwtPlot::xBottom, QwtPlot::yLeft,
        QwtPicker::PointSelection,// | QwtPicker::DragSelection,
        QwtPlotPicker::CrossRubberBand, QwtPicker::AlwaysOn,
        this->canvas());
    //tooltip informando os valores em x
    d_picker->setRubberBandPen(QColor(Qt::white));
    d_picker->setTrackerPen(QColor(Qt::white));

}

